文字列をGregorianCalendarに変換します
質問
Date:Mon、27 Oct 2008 08:33:29 -0700
のようなメールヘッダーの文字列があります。私が必要なのは、同じ瞬間を表すGregorianCalendarのインスタンスです。それと同じくらい簡単です-どうすればいいですか?
そして最速のものについては、これは正しく動作しません:
SimpleDateFormat format = ... // whatever you want
Date date = format.parse(myString)
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date)
タイムゾーンをUTC(またはJavaバージョンに応じてローカルマシンの時間)に正規化するためです。必要なのは、 -7 * milisInAnHour
を返すcalendar.getTimeZone()。getRawOffset()です。
解決
選択肢がある場合は、Joda Timeライブラリを調べることをお勧めします。コアプラットフォームが同様の機能を提供する場合、通常はサードパーティライブラリを使用することに反対しますが、Joda Timeの作成者もJSR310の背後にいるため、例外を作成しました。
http://joda-time.sourceforge.net/
とにかく、Joda Timeがオプションの場合、次のようなものが動作するはずです: :
DateTimeFormatter formatter =
DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();
これが役立つことを願っています。
他のヒント
そして最速のもの-これは適切に動作しません... タイムゾーンをUTC(またはJavaバージョンに応じてローカルマシンの時間)に正規化するためです。必要なのは、-7 * milisInAnHourを返すcalendar.getTimeZone()。getRawOffset()です。
まあ技術的にはこれは機能します。なぜなら、TimeZoneが現在のシステムのTimeZoneと等しいオブジェクトを返す一方で、オフセットを考慮して時刻が修正されるからです。
このコード:
String dateString = "Mon, 27 Oct 2008 08:33:29 -0700";
DateFormat df = new SimpleDateFormat("E, dd MMM yyyy hh:mm:ss Z");
Date parsed = df.parse(dateString);
System.out.println("parsed date: " + parsed);
Calendar newCalendar = Calendar.getInstance();
newCalendar.setTime(parsed);
出力:
解析日:月10月27日11:33:29 EDT 2008
これは技術的には正しいです。私のシステムのタイムゾーンはEDT / UTCから4時間(これはあなたの3時間先です)です。 1970年1月1日00:00:00 GMT( Date
オブジェクトが日付/時刻を格納する方法)以降のミリ秒数として時間を表す場合、これらの日付/時刻は等しくなります。異なるのはTimeZoneだけです。
あなたの問題は本当に日付/カレンダーをタイムゾーンに変換するにはどうすればよいですか?そのために、前の質問 Javaを使用してカレンダーのTimeZonesを処理する方法